package v1

import (
	"gin-blog/model"
	"gin-blog/utils/msg"
	"github.com/gin-gonic/gin"
	"net/http"
	"strconv"
)

// 添加文章

// 根据文章名查询文章

// 根据文章id查询单个文章

// 查询文章列表

// 修改文章

// 删除文章

// AddArticle 添加文章
func AddArticle(c *gin.Context) {
	var article model.Article
	// 为Article进行数据绑定
	_ = c.ShouldBindJSON(&article)
	code := model.AddArticle(&article)

	// 传出结果
	c.JSON(http.StatusOK, msg.R(code, "article", article))
}

// GetArticleByTitle 根据文章标题查询文章
func GetArticleByTitle(c *gin.Context) {
	title := c.Param("title")
	articles, count := model.GetArticleByTitle(title)
	var code = msg.SUCCESS
	if articles == nil {
		code = msg.ERROR
	}
	// 传输多个字段需要定义一个map
	var dataMap = make(map[string]interface{})
	dataMap["articles"] = articles
	dataMap["count"] = count
	c.JSON(http.StatusOK, msg.RS(code, dataMap))
}

// GetArticleInfo 根据id查询文章
func GetArticleInfo(c *gin.Context) {
	id, _ := strconv.Atoi(c.Param("id"))
	article, code := model.GetArticleInfo(id)
	c.JSON(http.StatusOK, msg.R(code, "article", article))
}

// GetArticleByCategory 查询文章列表
func GetArticleByCategory(c *gin.Context) {

	cid, errCid := strconv.Atoi(c.Query("cid"))
	pageSize, errSize := strconv.Atoi(c.Query("pagesize"))
	pageNum, errNum := strconv.Atoi(c.Query("pagenum"))
	// gorm中存在方法，如果db.Limit中值为-1，则表示不需要Limit
	if pageSize == 0 {
		pageSize = -1
	}
	// gorm中存在方法，如果db.Offset中值为-1，则表示不需要Offset
	if pageNum == 0 {
		pageNum = -1
	}

	var articles []model.Article
	var count int
	code := msg.SUCCESS

	// 错误处理，防止输入的大小和页码不是数字
	if errSize != nil {
		code = msg.ERROR_ARTICLE_LIST_SIZE
	} else if errNum != nil {
		code = msg.ERROR_ARTICLE_LIST_NUM
	} else if errCid != nil {
		code = msg.ERROR_CATEGORY_ID
	} else {
		articles, count = model.GetArticleByCategory(cid, pageSize, pageNum)
		if articles == nil {
			code = msg.ERROR_ARTICLE_LIST_SELECT
		}
	}
	// 传输多个字段需要定义一个map
	var dataMap = make(map[string]interface{})
	dataMap["articles"] = articles
	dataMap["count"] = count
	c.JSON(http.StatusOK, msg.RS(code, dataMap))
}

// GetArticles 查询文章列表
func GetArticles(c *gin.Context) {

	pageSize, errSize := strconv.Atoi(c.Query("pagesize"))
	pageNum, errNum := strconv.Atoi(c.Query("pagenum"))
	// gorm中存在方法，如果db.Limit中值为-1，则表示不需要Limit
	if pageSize == 0 {
		pageSize = -1
	}
	// gorm中存在方法，如果db.Offset中值为-1，则表示不需要Offset
	if pageNum == 0 {
		pageNum = -1
	}

	code := msg.SUCCESS
	// 传输多个字段需要定义一个map
	var dataMap = make(map[string]interface{})
	// 错误处理，防止输入的大小和页码不是数字
	if errSize != nil {
		code = msg.ERROR_ARTICLE_LIST_SIZE
	} else if errNum != nil {
		code = msg.ERROR_ARTICLE_LIST_NUM
	} else {
		articles, count := model.GetArticles(pageSize, pageNum)
		if articles == nil {
			code = msg.ERROR_ARTICLE_LIST_SELECT
		}
		dataMap["articles"] = articles
		dataMap["count"] = count
	}

	c.JSON(http.StatusOK, msg.RS(code, dataMap))
}

// EditArticle 修改文章
func EditArticle(c *gin.Context) {
	var article model.Article
	err := c.ShouldBindJSON(&article)
	id, _ := strconv.Atoi(c.Param("id"))

	code := msg.SUCCESS
	if err != nil {
		code = msg.ERROR_REQUEST_DATA
	} else {
		code = model.EditArticle(&article, id)
	}

	c.JSON(http.StatusOK, msg.R(code, "article", article))
}

// DeleteArticle 删除文章，软删除，不会真正删除，会在delete_at字段中插入删除时间，查询的时候也不会将这条数据查出来
func DeleteArticle(c *gin.Context) {
	id, _ := strconv.Atoi(c.Param("id"))
	code := model.DeleteArticle(id)
	c.JSON(http.StatusOK, msg.R(code, "id", id))
}
